<?php

/*************** 2.15 处理非常大或非常小 *****************/

// 问题
// 需要使用 非常大（或非常小）的数，以至于无法使用 PHP 的内置浮点数表示

// 解决方案

// 使用 BCMath/GMP 库

// BCMath:

$sum = bcadd('12345678912345679', '8765432187364321');
// 21111111099710000


// using GMP:

$sum1 = gmp_add('12345678912345679', '8765432187364321');


/*************************************************
 * BCMath 将数字作为字符串传入函数，它会将数字的和（差，积等）
 * 作为字符串返回。不过使用 BCMath 时，对数字所能完成的操作仅限于
 * 基本算术运算
 *****************************************************/



/*************************************************
 * GMP 未与 PHP 捆绑发行 所以需要另外下载安装
 * GMP 尽管大多数 GMP 函数都接受整数和字符串作为参数，不过它们
 * 更乐于将数字作为资源来传递，这实际上指向数字内部表示的指针
 * GMP 函数只返回资源。可用将整个资源作为数字传递到任何 GMP 函数
 * GMP 函数可用接受多种不同类型的参数。
 * 除了加法外，还可用使用 GMP 数做很多事情，如求一个数的幂，
 * 大阶乘，最大公因数 等
 *****************************************************/

/*****************************************************
 * 检查是否配置
 * 通过 function_defined('bcadd')
 *  function_defined('gmp_init')
 *****************************************************/


// 求幂

$pow = gmp_pow(2,10);

/*****************************************************
 * 高精度数学运算的另外选择是使用 PECL 的 big_int 库
 * 比 BCMath 更快 与 GMP 相当
 *****************************************************/


